# -*- coding: utf-8 -*-
import numpy as np
import operator

def createDataSet():
    group =np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,01]])
    labels=['A','A','B','B']
    return group ,labels

def classify0(inx,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]
    diffMat=np.tile(inx,(dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5
    sortedDistIndicies=distances.argsort()
    classCount={}
    for i in range(k):
        voteILabel=labels[sortedDistIndicies[i]]
        classCount[voteILabel]=classCount.get(voteILabel,0)+1
    sortedCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedCount[0][0]
def file2matrix(filename):
    love_dictionary={'largeDoses':3, 'smallDoses':2, 'didntLike':1}
    fr=open(filename)
    arrayOLines=fr.readlines()
    numberOfLines=len(arrayOLines)
    returnMat=np.zeros((numberOfLines,3))
    classLabelVector=[]
    index=0
    for line in arrayOLines:
        line=line.strip()
        listFromLine=line.split('\t')
        returnMat[index,:]=listFromLine[0:3]
        classLabelVector.append(love_dictionary.get(listFromLine[-1]))
        index+=1
    return returnMat,classLabelVector

def autoNum(dataSet):
    """
    （值-最小值）/(最大值-最小值)
    """
    minVals=dataSet.min(0)
    maxVals=dataSet.max(0)
    ranges=maxVals-minVals
    normDataSet=np.zeros(np.shape(dataSet))
    m=dataSet.shape[0]
    normDataSet=dataSet-np.tile(minVals,(m,1))
    normDataSet=normDataSet/np.tile(ranges,(m,1))
    return normDataSet,ranges,minVals

def datingClassTest():
    hoRatio=0.15
    datingDataMat,datingLabels=file2matrix(r'd:\WEB\KNN\dts.txt')
    normMat,ranges,minVals=autoNum(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],#取一行
            normMat[numTestVecs:m,:],# 取第100到第1000行数据
            datingLabels[numTestVecs:m], #标签也是
            3
        )
        print u"计算：%d,记录：%d" % (classifierResult,datingLabels[i])
        if(classifierResult!=datingLabels[i]):errorCount+=1.0
    print u"错误率: %f"%(errorCount/float(numTestVecs))









